package com.qq.open.weibo;

import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;

import org.apache.http.entity.mime.MultipartEntity;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.entity.mime.content.StringBody;
import org.apache.log4j.Logger;

import com.qq.open.common.OpenQqConstants;
import com.qq.open.common.OpenQqUtils;
import com.qq.open.common.json.JSONException;
import com.qq.open.common.json.JSONObject;
import com.qq.open.weibo.bean.param.WeiBoAddPicTParamBean;
import com.qq.open.weibo.bean.result.WeiBoAddPicTResultBean;

/**
 * 上传一张图片，并发布一条消息到腾讯微博平台上
 * 
 * @author HaoLiang
 * @version 0.1.1
 */
public class WeiBoAddPicT {

	/** QQ互联工具类 */
	private OpenQqUtils oqu = new OpenQqUtils();
	
	/** 日志 */
	private Logger log = Logger.getLogger(WeiBoAddPicT.class);
	
	
	/**
	 * 上传一张图片，并发布一条消息到腾讯微博平台上
	 * 
	 * @param paramBean 参数
	 * @return 接口返回内容
	 * @throws IOException 
	 * @throws JSONException 
	 */
	public WeiBoAddPicTResultBean addPicT(WeiBoAddPicTParamBean paramBean) throws IOException, JSONException {
		
		// 日志
		log.info("上传一张图片，并发布一条消息到腾讯微博平台 开始....");
		
		// 请求发布微博接口 并 接受返回值
		String jsonData = oqu.doPost(OpenQqConstants.WEIBO_ADD_PIC_T_URL, this.getInterfaceData(paramBean));
		
		// 返回javaBean的接口数据
		WeiBoAddPicTResultBean resultBean = this.jsonToResultBean(jsonData);
		
		// 日志
		log.info("上传一张图片，并发布一条消息到腾讯微博平台 结束....");
		
		return resultBean;
	}
	
	
	
	
	/**
	 * 获取发布微博的参数 包含上传图片内容
	 * 
	 * @param paramBean 参数
	 * @return post参数
	 * @throws UnsupportedEncodingException
	 */
	private MultipartEntity getInterfaceData(WeiBoAddPicTParamBean paramBean) throws UnsupportedEncodingException {
		MultipartEntity reqEntity = new MultipartEntity();
		
		// AccessToken
	    reqEntity.addPart("access_token", new StringBody(paramBean.getAccessToken()));
	    
	    // AppId
	    reqEntity.addPart("oauth_consumer_key", new StringBody(oqu.getConfigValue("qq.appid")));
	    
	    // OpenId
	    reqEntity.addPart("openid", new StringBody(paramBean.getOpenId()));
	    
	    // 表示要发表的微博内容
	    reqEntity.addPart("content", new StringBody(paramBean.getContent(), Charset.forName("UTF-8")));
	    
	    // 定义API返回的数据格式
		reqEntity.addPart("format", new StringBody("json"));
		
		// 图片的内容
		FileBody fileBody = new FileBody(new File(paramBean.getPicPath()));
		reqEntity.addPart("pic", fileBody);
	    
	    // 用户ip
	    if (oqu.isNotNull(paramBean.getClientIp())) {
	    	reqEntity.addPart("clientip", new StringBody(paramBean.getClientIp()));
		}
		
		// 用户所在地理位置的经度
		if (oqu.isNotNull(paramBean.getLongitude())) {
			reqEntity.addPart("jing", new StringBody(paramBean.getLongitude()));
		}
		
		// 用户所在地理位置的纬度
		if (oqu.isNotNull(paramBean.getLatitude())) {
			reqEntity.addPart("wei", new StringBody(paramBean.getLatitude()));
		}
		
		// 同步到QQ空间标识   0：同步 1：不同步
		if (oqu.isNotNull(paramBean.getSyncFlag())) {
			reqEntity.addPart("syncflag", new StringBody(paramBean.getSyncFlag()));
		}
	    
		return reqEntity;
	}
	
	
	/**
	 * 把接口返回的json数据转换成Bean
	 * 
	 * @param jsonData 接口返回的数据
	 * @return 转换后的数据
	 * @throws JSONException 
	 */
	private WeiBoAddPicTResultBean jsonToResultBean(String jsonData) throws JSONException {
	
		WeiBoAddPicTResultBean resultBean = new WeiBoAddPicTResultBean();
		
		JSONObject jsonObj;
		try {
			jsonObj = new JSONObject(jsonData);
			
			// 添加微博失败的场合
			if (jsonObj.getInt("ret") != 0) {
				// 错误标识
				resultBean.setErrorFlg(true);
				
				// 错误编号
				resultBean.setErrorCode(jsonObj.get("ret").toString());
				
				// 错误信息
				resultBean.setErrorMes(jsonObj.getString("msg"));
				
			} else {
				// 获取微博数据
				JSONObject jsonDataObj = new JSONObject(jsonObj.getJSONObject("data").toString());
				
				// 获取微博ID
				resultBean.setAddWeiBoId(jsonDataObj.get("id").toString());
				
				// 获取微博发布时间
				resultBean.setAddWeiBoDate(oqu.timeStampToDate(jsonDataObj.get("time").toString()));
			}
		} catch (JSONException e) {
			e.printStackTrace();
			// 日志
			log.error("addPicT 异常，json数据是：" + jsonData);
			throw e;
		}
		
		return resultBean;
	}
}
